/*
 * Copyright 2009-2019 the original author or authors  
 *
 */
package com.livery.liu.util;

import java.util.ArrayList;
import java.util.List;


/**
 *
 * <p></p>
 * <pre class="code">
 *  
 * </pre>
 *
 * @author  <a href="mailto:livery.liu@gmail.com"> livery liu</a>
 */
@SuppressWarnings("unchecked")
public class Page<T> {


	/**页面默认数据容量
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	private static final Integer DEFAULT_PAGESIZE = 10;
	
	//页面数据容量
	private Integer pageSize = DEFAULT_PAGESIZE;
	
	// 当前页第一条数据在List中的位置,从0开始
	private Integer startIndex ;
	
	//总共多少条记录
	private Integer totalRows ;
	
	//分页结果
	private Object results;
	
	/**
	 * 构造方法，构造了一个空页.
	 */
	public Page(){
		this(0,0,DEFAULT_PAGESIZE,new ArrayList());
	}
	
	/**默认构造方法
	 * @param startIndex 本页数据在数据库中的起始位置
	 * @param totalRows 数据库中的总记录数
	 * @param pageSize 页面的数据容量
	 * @param list
	 */
	public Page(int startIndex,int totalRows,int pageSize,List list){
		this.startIndex = startIndex;
		this.totalRows = totalRows;
		this.pageSize = pageSize;
		this.results = list;
	}	
	
	
	/**
	 * 得到总页数，页码从1开始
	 * @return
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	public Integer getTotalPages(){
		if (totalRows % pageSize == 0)
			return totalRows / pageSize;
		else
			return totalRows / pageSize + 1;
	}
	
	/**
	 * 取当前页码,页码从1开始.
	 * @return 
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	public Integer getCurrentPage() {
		return startIndex / pageSize + 1;
	}
	
	/**取每页数据容量
	 * @return.
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	public int getPageSize() {
		return pageSize;
	}	
	
	/**取得分页结果list类型，不是list返回空list
	 * @return
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	public List getList(){
		
		return  results instanceof List ? (List<T>)results : new ArrayList<T>();
	}
	
	/**得到下一页
	 * @return
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	public Integer getNextPage(){		
		return hasNextPage()?getCurrentPage()+1:0;
	}
	
	/**得到上一页
	 * @return
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	public Integer getPrePage(){	
		return hasPrePage()?getCurrentPage()-1:0;
	}	
	
	/** 该页是否有下一页.
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	public boolean hasNextPage() {
		return this.getCurrentPage() < this.getTotalPages() - 1;
	}

	/**该页是否有上一页.
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	public boolean hasPrePage() {
		return this.getCurrentPage() > 1;
	}

	/** 获取任一页第一条数据在数据集的位置，每页条数使用默认值.
	 * @see #getStartOfPage(int,int)
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	protected static int getStartOfPage(int pageNo) {
		return getStartOfPage(pageNo, DEFAULT_PAGESIZE);
	}

	/**获取任一页第一条数据在数据集的位置.
	 * @param pageNo   从1开始的页号
	 * @param pageSize 每页记录条数
	 * @return 该页第一条数据
	 * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
	 */
	public static int getStartOfPage(int pageNo, int pageSize) {
		return (pageNo - 1) * pageSize;
	}	
	
	/****************另一种分页显示*********************************/	
		
	
	//默认展示页数
    protected final static int DEFAULT_SHOW_PAGE_NUMBER_COUNT = 9;
    
    //展示页数的数组
    private int[] showPageNumbers;
    
    /**得到展示页数的数组
     * @return
     * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
     */
    public int[] getShowPageNumbers() {
        return getShowPageNumbers(DEFAULT_SHOW_PAGE_NUMBER_COUNT);
    }

    
    /**得到每次分页展示的页数数组
     * @param showCount
     * @return
     * @author <a href="mailto:grasslx@yahoo.com.cn"> livery liu</a>
     */
    public int[] getShowPageNumbers(int showCount) {
        int currentPage = startIndex / pageSize + 1;
        if (showPageNumbers == null) {
            int totalPageCount = getTotalPages();
            showPageNumbers = new int[totalPageCount > showCount ? showCount : totalPageCount];
            if (totalPageCount > showCount) {
                int firstShowPage = currentPage - (showCount + 1) / 2;
                int endShowPage = currentPage + showCount / 2;
                if (firstShowPage > 0 && endShowPage < totalPageCount) {
                    for (int i = 0, max = showPageNumbers.length; i < max; i++) {
                        showPageNumbers[i] = firstShowPage + i + 1;
                    }
                } else if (firstShowPage > 0) {
                    for (int i = 0, max = showPageNumbers.length; i < max; i++) {
                        showPageNumbers[i] = totalPageCount - showCount + i;
                    }
                } else {
                    for (int i = 0, max = showPageNumbers.length; i < max; i++) {
                        showPageNumbers[i] = i;
                    }
                }
            } else {
                for (int i = 0, max = showPageNumbers.length; i < max; i++) {
                    showPageNumbers[i] = i;
                }
            }
        }
        return showPageNumbers;
    }

	public Object getResults() {
		return results;
	}

	public void setResults(Object results) {
		this.results = results;
	}
}
